package org.cagrid.gme.service.impl.dao; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.Example; import org.hibernate.criterion.MatchMode; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import javax.persistence.NonUniqueResultException; import java.sql.SQLException; import java.util.Collection; import java.util.List; public abstract class AbstractDao<T> extends HibernateDaoSupport { public abstract Class domainClass(); public T getByExample(final T sample) { T result = null; List<T> results = searchByExample(sample, false); if (results.size() > 1) { throw new NonUniqueResultException("Found " + results.size() + " " + sample.getClass().getName() + " objects."); } else if (results.size() == 1) { result = results.get(0); } return result; } @SuppressWarnings("unchecked") public T getById(int id) { return (T) getHibernateTemplate().get(domainClass(), id); } @SuppressWarnings("unchecked") public List<T> searchByExample(final T sample, final boolean inexactMatches) { return (List<T>) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Example example = Example.create(sample).excludeZeroes(); if (inexactMatches) { example.ignoreCase().enableLike(MatchMode.ANYWHERE); } return session.createCriteria(domainClass()).add(example).list(); } }); } public List<T> searchByExample(T example) { return searchByExample(example, true); } public void save(Collection<T> domainObjects) { getHibernateTemplate().saveOrUpdateAll(domainObjects); } public void save(T domainObject) { getHibernateTemplate().saveOrUpdate(domainObject); } public void update(T domainObject) { getHibernateTemplate().update(domainObject); } public void delete(T domainObject) { getHibernateTemplate().delete(domainObject); } public void delete(Collection<T> domainObjects) { getHibernateTemplate().deleteAll(domainObjects); } public List<T> getAll() { return getHibernateTemplate().find("from " + domainClass().getSimpleName()); } }